package cn.demoncat.util.web;

import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import cn.demoncat.util.lang.CollectionUtil;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.lang.constant.StringConstant;


/**
 * HTTP Header工具
 * 
 * @author 延晓磊
 *
 * @since 2019年10月13日
 */
public class HeaderUtil {

	/**
	 * Header 常用名称
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月12日
	 */
	public interface HeaderName{
		
		 /**
	     * Accept
	     */
	    String ACCEPT = "Accept";
	    /**
	     * Accept-Charset
	     */
	    String ACCEPT_CHARSET = "Accept-Charset";
	    /**
	     * Accept-Encoding
	     */
	    String ACCEPT_ENCODING = "Accept-Encoding";
	    /**
	     * Accept-Language
	     */
	    String ACCEPT_LANGUAGE = "Accept-Language";
	    /**
	     * Accept-Ranges
	     */
	    String ACCEPT_RANGES = "Accept-Ranges";
	    /**
	     * Age
	     */
	    String AGE = "Age";
	    /**
	     * Allow
	     */
	    String ALLOW = "Allow";
	    /**
	     * Cache-Control
	     */
	    String CACHE_CONTROL = "Cache-Control";
	    /**
	     * Connection
	     */
	    String CONNECTION = "Connection";
	    /**
	     * Content-Encoding
	     */
	    String CONTENT_ENCODING = "Content-Encoding";
	    /**
	     * Content-Language
	     */
	    String CONTENT_LANGUAGE = "Content-Language";
	    /**
	     * Content-Length
	     */
	    String CONTENT_LENGTH = "Content-Length";
	    /**
	     * Content-Location
	     */
	    String CONTENT_LOCATION = "Content-Location";
	    /**
	     * Content-MD5
	     */
	    String CONTENT_MD5 = "Content-MD5";
	    /**
	     * Content-Range
	     */
	    String CONTENT_RANGE = "Content-Range";
	    /**
	     * Content-Type
	     */
	    String CONTENT_TYPE = "Content-Type";
	    /**
	     * Content-Disposition：常用于文件下载
	     */
	    String CONTENT_DISPOSITION = "Content-Disposition";
	    /**
	     * User-Agent
	     */
	    String USER_AGENT = "User-Agent";
	    /**
	     * Transfer-Encoding
	     */
	    String TRANSFER_ENCODING = "Transfer-Encoding";
	    /**
	     * Cookie：k1=v1;k2=v2
	     */
	    String COOKIE = "Cookie";
	    /**
	     * Set-Cookie（响应）：k=v; expires=Wed, 13-Nov-2019 05:44:57 GMT; Max-Age=2592000; path=/
	     */
	    String SET_COOKIE = "Set-Cookie";
	    /**
	     * token
	     */
	    String TOKEN = "token";
	}
	
	/**
	 * Header 常用值
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年10月12日
	 */
	public interface HeaderValue{
		
		/**
	     * Accept-Language：zh-CN,zh;q=0.8
	     */
	    String ACCEPT_LANGUAGE = getAcceptLanguage();
		
	    /**
	     * User-Agent：火狐浏览器、Windows
	     */
	    String USER_AGENT_WF = "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0";
	    
	    
	}
	
	
	 /**
	  * 获取客户端语言
	  * 
	  * @return Header：Accept-Language
	  * 
	  * @author 延晓磊
	  *
	  * @since 2019年10月13日
	  */
    public static String getAcceptLanguage() {
    	// 获取系统本地化信息
        Locale locale = Locale.getDefault();
        String language = locale.getLanguage();
        String country = locale.getCountry();
        // zh-CN,zh;q=0.8
        StringBuilder sb = new StringBuilder(language);
        if (StringUtils.isNotBlank(country)) {
            sb.append('-').append(country).append(',').append(language).append(";q=0.8");
        }
        return sb.toString();
    }
    
    /**
     * 设置Cookie到请求头
     * 
     * @param header	请求头
     * @param cookies	cookie
     * 
     * @author 延晓磊
     *
     * @since 2019年10月14日
     */
    public static void setCookie(Map<String, String> header, Map<String, String> cookies) {
    	header.put(HeaderName.COOKIE, CookieUtil.getRequestCookie(cookies));
    }
    
    /**
     * 通过响应头获取Cookie
     * 
     * @param header	响应头
     * 
     * @return cookies
     * 
     * @author 延晓磊
     *
     * @since 2019年10月14日
     */
    public static Map<String, String> getCookie(Map<String, List<String>> header) {
    	return CookieUtil.getResponseCookie(header.get(HeaderName.SET_COOKIE));
    }
    
    /**
     * 根据响应头，获取Content-Disposition：attachment;filename=?
     * 
     * @param header
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2019年10月14日
     */
    public static String getAttachName(Map<String, List<String>> header) {
    	List<String> list = header.get(HeaderName.CONTENT_DISPOSITION);
    	if (CollectionUtil.isNotEmpty(list)) {
			String fn = list.get(0);
			if (StringUtils.isNotBlank(fn)) {
				// Nginx下载文件：attachment; filename*=utf-8'zh_cn'xxx.txt
				int i = fn.indexOf("'zh_cn'");
				if (i > 0) {
					return fn.substring(i + 8).trim();
				}
				// Web下载文件：attachment; filename=ISO8859
				i = fn.indexOf("filename=");
				if (i > 0) {
					return StringUtil.iso2Utf(fn.substring(i + 10).trim());
				}
				i = fn.indexOf("filename*=");
				if (i > 0) {
					return StringUtil.iso2Utf(fn.substring(i + 11).trim());
				}
			}
		}
    	return StringConstant.EMPTY;
    }
    

}
